/*******************************************************************************
 * Copyright (c) 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.takaharabooks.mhp3rd;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.view.View;
import android.widget.ImageView;

/*************************************
 *************************************
 * ＳＤからよみこみ処理をするクラス
 **************************************
 **************************************/
class ImageGetTask extends AsyncTask<String,Void,Bitmap>
{
    protected ImageView image;
    protected String tag;
    protected String m_strImageFName;
    protected Context mContext;
 
    public ImageGetTask(ImageView _image, String strImageFName, Context context ) {
        //対象の項目を保持しておく
    	mContext = context;
        image = _image;
        m_strImageFName = strImageFName + ".jpg";
        tag = image.getTag().toString();
    }
 
    @Override
    protected Bitmap doInBackground(String... params) {
        // ここでHttp経由で画像を取得します。取得後Bitmapで返します。
        synchronized (this){
            try {
                //キャッシュより画像データを取得
                Bitmap image = ImageCache.getImage(params[0]);
                if (image == null) {
                    //キャッシュにデータが存在しない場合はSDより画像データを取得
                    image = BitmapFactory.decodeFile(params[0], new BitmapFactory.Options());
                    //SDにデータが存在しない場合はwebより画像データを取得
                    if(image == null && isConnected()){
                    	CopyFileFromWeb(mContext.getResources().getString(R.string.IMAGE_URL_STR) + m_strImageFName,
                    					mContext.getResources().getString(R.string.SD_DIR_PATH),
                    					m_strImageFName);
                    	image = BitmapFactory.decodeFile(params[0], new BitmapFactory.Options());
                    }
                    //取得した画像データをキャッシュに保持
                    ImageCache.setImage(params[0], image);
                }
                return image;
            } catch (Exception e) {
                return null;
            }
        }
    }

    ///////////////////////////////////////////////////
	// ↓↓　Ｗｅｂ上のファイルをコピーする
	public boolean CopyFileFromWeb(String strURL, String strOutputDir, String strOutputFileName){
		FileCopy(GetInputStreamFromURL(strURL), GetFileOutputStream(strOutputDir, strOutputFileName));
		return true;
	}
	
    ///////////////////////////////////////////////////
	// ↓↓　ファイルをコピーする
	private boolean FileCopy(InputStream csIs, FileOutputStream csFos){
		
		int DEFAULT_BUFFER_SIZE = 1024 * 4;
    	byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    	int n = 0;
	    
    	try{
	    	// 読み込んで書き込みをループで。
	    	while (-1 != (n = csIs.read(buffer))) {
	    		csFos.write(buffer, 0, n);
		    }
	    	
	    	csIs.close();
	    	csFos.close();
		}catch(IOException e){
			//RLogCat.OutputLog("RFileOperater", "FileCopy_Error");
	   	}
	
		return true;
	}
	
    ///////////////////////////////////////////////////
	// ↓↓　ＵＲＬからInputStreamを取得する
	public InputStream GetInputStreamFromURL(String strURL){
		try {
			URL csUrl = new URL(strURL);
		    return csUrl.openConnection().getInputStream();
		} catch (MalformedURLException e) {
			//RLogCat.OutputLog("RFileOperater", "GetInputStreamFromURL" + strURL);
			return null;//throw new RuntimeException(e);
		} catch (IOException e) {
			//RLogCat.OutputLog("RFileOperater", "GetInputStreamFromURL" + strURL);
			return null;//throw new RuntimeException(e);
		}
	}
	
    ///////////////////////////////////////////////////
	// ↓↓　FileOutputStreamを取得する
	public FileOutputStream GetFileOutputStream(String strOutputDir, String strOutputFileName){
		FileOutputStream csFos = null;
		// Out用フォルダがなければ作成。あれば作らない
		MakeDir(strOutputDir);
		try{
			csFos = new FileOutputStream(strOutputDir + "/" + strOutputFileName, false);
		}catch(IOException e){
			//RLogCat.OutputLog("RFileOperater", "GetFileOutputStream_Error");
	   	}
		return csFos;
	}
	
    ///////////////////////////////////////////////////
	// ↓↓　ディレクトリを作成する
	public boolean MakeDir(String strDirPath){
		File csFile = new File(strDirPath);
		if(!IsDirExist(strDirPath)){
			csFile.mkdirs();
		}
		return true;
	}

	///////////////////////////////////////////////////
	// ↓↓　ディレクトリが存在するかチェック
	public boolean IsDirExist(String strDirPath){
		File csFile = new File(strDirPath); 
		return csFile.exists();
	}
	
    /*************************************
     * ビットマップを指定の大きさにリサイズします
     * [I-O]csBmp:リサイズする画像
     * [IN.]nW：横幅
     * [IN.]nH:縦幅（０の場合、横幅の倍率に合わせてリサイズ）
     * return: リサイズした画像を返す
     **************************************/
    public Bitmap ResizeBitmap(Bitmap csBmp, int nW, int nH){
        int width = csBmp.getWidth();
        int height = csBmp.getHeight();
        int newWidth = nW;
        int newHeight = nH;

        // calculate the scale - in this case = 0.4f
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        if(newHeight == 0){
        	scaleHeight = scaleWidth;
        }

        // createa matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
        // rotate the Bitmap
        //matrix.postRotate(45);

        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(csBmp, 0, 0,
                          width, height, matrix, true);
        csBmp = resizedBitmap;

        return resizedBitmap;
    }
    
    // 接続確認
    public boolean isConnected(){
        ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if( ni != null ){
            return cm.getActiveNetworkInfo().isConnected();
        }
        return false;
    }    	
}    
